package main

import "fmt"

// 题目
//	数字 n 代表生成括号的对数，请你设计一个函数，用于能够生成所有可能的并且 有效的 括号组合。
// 思路 暴力递归
// 方法 1 ：暴力递归查找锁有结果然后验证结果
//	考点
//		1. 递归
//		2. 字符串数组的使用
//  mismatched types string and rune
//  rune (字符): int32的别名，几乎在所有方面等同于int32 在Golang 中字符默认是 rune 是int32 存储的使用的
//  它用来区分字符值和整数值
//	切片在函数传递中需要注意的事项 ，切片是指针引用，传递切片时，不要在内部使用 append
//  在递归嵌套中 一般使用List 记录整个递归中使用到数据；

func generateParenthesis(n int) []string {
	arr:=""
	res :=make([]string,2*n) // 切片数组的使用方式 需要使用列表的方式来实现； 对于大的数据最多的需要 数据量是 n*(n-1)....1 这里的n =2n 括号
	pos:=0
	site :=0
	generateAll(n*2,arr,pos,res,&site)
	return res
}

func generateAll(length int,arr string,pos int ,res []string ,site *int ){ // 切片是引用的方式，尽量不要使用数组来保存整个递归过程中需要使用到的数据；
	if pos == length {
		if Valid(arr) {
			res[*site]=arr
			*site++
			//append() 使用切片后数组建立新的切片 append ，在底层创建了新的数组 ,然后进行引用了；切片无法进行传递了在函数中，外面切片传递进来后，不要使用 append ;
			//fmt.Println(res)
		}
	}else{
		arr=arr[:pos]+string('(')
		generateAll(length,arr,pos+1,res,site)
		arr=arr[:pos]+string(')')
		generateAll(length,arr,pos+1,res,site)
	}
}

func Valid( arr string ) bool{
	balance := 0
	for i,_ :=range arr{
		if arr[i] == byte('(') {
			balance++
		}else {
			balance--
			if balance < 0  {
				return false
			}
		}
	}
	if balance != 0 {
		return false
	}
	return true
}

func main(){
	fmt.Println(generateParenthesis(3))
}